package org.geekbang.thinking.in.spring.bean.definition;

import org.geekbang.thinking.in.spring.ioc.overview.domain.SuperUser;
import org.geekbang.thinking.in.spring.ioc.overview.domain.User;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.GenericBeanDefinition;

/**
 * {@link org.springframework.beans.factory.config.BeanDefinition} 构建示例
 *
 * @author wangyh2
 * @version v1.0
 * @since 2021-09-13 13:38
 */
public class BeanDefinitionCreationDemo {
    public static void main(String[] args) {
        // 1, 通过BeanDefinitionBuilder 构建
        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(User.class);
        // 通过属性设值
        beanDefinitionBuilder
                .addPropertyValue("id", 1)
                .addPropertyValue("name", "sishen007");
        // 获取BeanDefinition实例 - // BeanDefinition 并非 Bean 终态，可以自定义修改
        BeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();

        // 2,通过AbstractBeanDefinition派生类
        GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();
        // 设置Bean类型
        genericBeanDefinition.setBeanClass(User.class);
        MutablePropertyValues propertyValues = new MutablePropertyValues();
        propertyValues
                .add("id", 1)
                .add("name", "sishen007");
        genericBeanDefinition.setPropertyValues(propertyValues);
    }
}
